/**
 * Description:
 * Class Name:ProxyTest
 * Date:2022/4/30 18:34
 *
 * @author LTisme
 * @version JAVA17
 */
package 疯狂Java讲义.第18章_类加载机制与反射._18_5_使用反射生成JDK动态代理._18_5_1_使用Proxy和InvocationHandler创建动态代理;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

interface Person{
    void walk();
    void sayHello(String name);
}

class MyInvokationHandler implements InvocationHandler{
    /*
    执行动态代理对象的所有方法时，都会被替换成执行如下的invoke方法
    其中：
    proxy：代表动态代理对象
    method：代表正在执行的方法
    args：代表调用目标方法时传入的实参
     */
    public Object invoke(Object proxy, Method method, Object[] args){
        System.out.println("---正在执行的方法：" + method);
        if (args != null){
            System.out.println("下面是执行该方法时传入的实参为：");
            for (var val :
                    args) {
                System.out.println(val);
            }
        }
        else {
            System.out.println("调用该方法没有实参！");
        }
        return null;
    }
}

public class ProxyTest {
    public static void main(String[] args) throws Exception{
        // 创建一个InvocationHandler对象
        InvocationHandler handler = new MyInvokationHandler();
        // 使用指定的InvocationHandler来生成一个动态代理对象
        var p = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class}, handler);
        // 调用动态代理对象的walk()和sayHello()方法
        p.walk();
        p.sayHello("路人甲");
    }
}
//---正在执行的方法：public abstract void 疯狂Java讲义.第18章_类加载机制与反射._18_5_使用反射生成JDK动态代理._18_5_1_使用Proxy和InvocationHandler创建动态代理.Person.walk()
//调用该方法没有实参！
//---正在执行的方法：public abstract void 疯狂Java讲义.第18章_类加载机制与反射._18_5_使用反射生成JDK动态代理._18_5_1_使用Proxy和InvocationHandler创建动态代理.Person.sayHello(java.lang.String)
//下面是执行该方法时传入的实参为：
//路人甲